// Package dao @author dingrui @since 2021/11/26
package dao

import (
	"github.com/go-xorm/xorm"

	"github.com/bannirui/mini-prize/dal/model"
	"github.com/bannirui/mini-prize/datasource"
)

//
//  BlackIpDao
//  @Description: 黑名单
//
type BlackIpDao struct {
	engine *xorm.Engine
}

var (
	// 单例
	G_blackIpDao *BlackIpDao
)

func init() {
	// 单例赋值
	G_blackIpDao = &BlackIpDao{engine: datasource.G_ormEngine}
}

//
//  InitBlackIpDao
//  @Description: 初始化
//  @param engine
//  @return *BlackipDao
//
func InitBlackIpDao(engine *xorm.Engine) {
	// 单例赋值
	G_blackIpDao = &BlackIpDao{
		engine: engine,
	}
}

//
//  GetById
//  @Description: 根据id获取
//  @receiver d
//  @param id
//  @return data
//
func (d *BlackIpDao) GetById(id int) (data *model.BlackIp) {
	var (
		err error
		ok  bool
	)
	data = &model.BlackIp{Id: id}
	if ok, err = d.engine.Get(data); !ok || err != nil {
		// 查询数据库失败
		data.Id = 0
	}
	return
}

//
//  PageAll
//  @Description: 分页查询
//  @receiver d
//  @param page
//  @param size
//  @return dataList
//
func (d *BlackIpDao) PageAll(page, size int) (dataList []model.BlackIp) {
	var (
		offset int
	)
	offset = (page - 1) * size
	// 初始化切片
	dataList = make([]model.BlackIp, 0)
	_ = d.engine.Desc("id").Limit(size, offset).Find(&dataList)
	return
}

//
//  CountAll
//  @Description: 计数
//  @receiver d
//  @return cnt
//
func (d *BlackIpDao) CountAll() (cnt int64) {
	var (
		err error
	)
	if cnt, err = d.engine.Count(&model.BlackIp{}); err != nil {
		cnt = 0
	}
	return
}

//
//  ListByIp
//  @Description: 根据ip查询
//  @receiver d
//  @param ip
//  @return dataList
//
func (d *BlackIpDao) ListByIp(ip string) (dataList []model.BlackIp) {
	// 初始化切片
	dataList = make([]model.BlackIp, 0)
	_ = d.engine.Where("ip=?", ip).Desc("id").Find(&dataList)
	return
}

//
//  Update
//  @Description: 更新
//  @receiver d
//  @param data
//  @param columns
//  @return err
//
func (d *BlackIpDao) Update(data *model.BlackIp, columns []string) (err error) {
	_, err = d.engine.MustCols(columns...).Update(data)
	return
}

//
//  InsertOne
//  @Description: 新增
//  @receiver d
//  @param data
//  @return err
//
func (d *BlackIpDao) InsertOne(data *model.BlackIp) (err error) {
	_, err = d.engine.Insert(data)
	return
}

//
//  GetByIp
//  @Description: 根据ip获取信息
//  @receiver d
//  @param ip
//  @return *model.BlackIp
//
func (d *BlackIpDao) GetByIp(ip string) *model.BlackIp {
	var (
		dataList []model.BlackIp
		err      error
	)
	// 初始化切片
	dataList = make([]model.BlackIp, 0)
	if err = d.engine.Where("ip=?", ip).Desc("id").Limit(1).Find(&dataList); err != nil || len(dataList) < 1 {
		return nil
	} else {
		return &dataList[0]
	}
}
